{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题描述"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 简述混合高斯模型的基本原理，以及通过混合高斯模型进行背景建模的基本思想。 \n",
    "2. 解释光流计算中的恒定亮度假设，进一步简述L-K光流估计方法的基本原理。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 简述混合高斯模型的基本原理，以及通过混合高斯模型进行背景建模的基本思想。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于普通帧差法存在相邻帧有重合导致提取前景目标空洞的问题以及存在噪声放大的问题，因此基于这一思想，产生了高斯模型的背景建模。<br>\n",
    "![avatar](./img/高斯模型原理1.png)\n",
    "![avatar](./img/高斯模型原理2.png)\n",
    "实际情况中，像素的灰度分布情况往往不能用一个简单的高斯模型去描述，这时候就产生了混合高斯模型<br>\n",
    "![avatar](./img/高斯模型原理3.png)\n",
    "对某一帧图像特定位置进行不同分量灰度值记录，得到二维图像，如下图所示，从图中看出该位置出现了几簇聚集，密集程度不同，每一簇可看作一个高斯分布，均值为聚类中心点。\n",
    "![avatar](./img/高斯模型原理4.png)\n",
    "水面波纹图像对应的二维灰度分布图像明显存在两个高斯分布，对应白天和晚上两个时间段。<br>\n",
    "下面通过数学公式对混合高斯模型进行描述<br>\n",
    "![avatar](./img/高斯模型原理5.png)\n",
    "![avatar](./img/高斯模型原理6.png)\n",
    "![avatar](./img/高斯模型原理7.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 解释光流计算中的恒定亮度假设，进一步简述L-K光流估计方法的基本原理。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "光流的概念是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度，是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系，从而计算出相邻帧之间物体的运动信息的一种方法。一般而言，光流是由于场景中前景目标本身的移动、相机的运动，或者两者的共同运动所产生的。其计算方法可以分为三类：<br>\n",
    "（1）基于区域或者基于特征的匹配方法；（L-K的方法）<br>\n",
    "（2）基于频域的方法；<br>\n",
    "（3）基于梯度的方法；<br>\n",
    "简单来说，光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”。光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”。研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。<br>\n",
    "光流法的前提假设：<br>\n",
    "（1）相邻帧之间的亮度恒定；<br>\n",
    "（2）相邻视频帧的取帧时间连续，或者，相邻帧之间物体的运动比较“微小”；<br>\n",
    "（3）保持空间一致性；即，同一子图像的像素点具有相同的运动。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`恒定亮度将设`:图像中目标的像素强度在连续帧之间不会发生变化。<br>\n",
    "![avatar](./img/光流计算恒定亮度假设.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`L-K光流估计基本原理:`<br>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据上面的光流估计基本模型得出方程$I_x\\Delta x+I_y\\Delta y=-I_t$，任务:求$(u,v)=(\\Delta x, \\Delta y)$，困难:一个方程包含两个未知数。<br>\n",
    "Lucas-Kanade方法采用基于领域的计算方法，假设在一个小方格里的所有像素位移相同。则会得到一组光流估计方程。用矩阵表示如下:<br>\n",
    "$$\\begin{bmatrix}I_{x1}&I_{y1}\\\\I_{x2}&I_{y2}\\\\\\vdots&\\vdots\\end{bmatrix}\\begin{bmatrix}u\\\\v\\end{bmatrix} = -\\begin{bmatrix}I_{t1}\\\\I_{t2}\\\\\\vdots\\end{bmatrix}$$\n",
    "即 $$Au = b$$\n",
    "$$A = \\begin{bmatrix}I_{x1}&I_{y1}\\\\I_{x2}&I_{y2}\\\\\\vdots&\\vdots\\end{bmatrix};$$\n",
    "$$u = \\begin{bmatrix}u\\\\v\\end{bmatrix}; b = -\\begin{bmatrix}I_{t1}\\\\I_{t2}\\\\\\vdots\\end{bmatrix}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 将上述问题转化为最优化问题(超定方程求解)<br>\n",
    "\n",
    "    $min\\left\\|Au - b\\right\\|$<br>\n",
    "    <br>\n",
    "* 最小二乘解:<br>\n",
    "\n",
    "    $u = (A^TA)^(-1)A^Tb$<br>\n",
    "    <br>\n",
    "* 区域像素只有2个时，就是2元1次方程组求解！<br>\n",
    "  多个像素，比如3*3时，则是求上述最小二乘解"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "进一步，L-K方法假定在一个小的图像邻域内速度近似一致<br>\n",
    "<br>约束: \n",
    "$$\n",
    "\\begin{align}\n",
    "& E(\\Delta x, \\Delta y) = \\sum_iw_i^2(I_{xi}\\Delta x + I_{yi}\\Delta y + I_{ti})^2\\\\\n",
    "& min E(\\Delta x, \\Delta y)\n",
    "\\end{align}\n",
    "$$\n",
    "<br>\n",
    "\n",
    "对应\n",
    "$$\\begin{bmatrix}w_1&0&0\\\\0&\\ddots&0\\\\0&0&w_N\\end{bmatrix}\\begin{bmatrix}I_{x1}&I_{y1}\\\\I_{x2}&I_{y2}\\\\\\vdots&\\vdots\\end{bmatrix}u = \\begin{bmatrix}w_1&0&0\\\\0&\\ddots&0\\\\0&0&w_N\\end{bmatrix}b$$\n",
    "<br>\n",
    "类似前述求解，可得$u = (A^TW^2A)^{-1}A^TW^2b$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 可信度判断:矩阵求逆是否能实现？\n",
    "$A^TA = \\begin{bmatrix}\\sum I_xI_x&\\sum I_xI_y\\\\\\sum I_xI_y&\\sum I_yI_y\\end{bmatrix} = \\sum\\begin{bmatrix}I_x\\\\I_y\\end{bmatrix}\\begin{bmatrix}I_x&I_y\\end{bmatrix} = \\sum\\nabla I(\\nabla I)^T$\n",
    "\n",
    "<br>我们在计算光流的时候，我们要求图像对应位置灰度变化充分(具有充分特征)，假如位置灰度变化平缓，那么沿x和y方向的偏倒就可能为0，那么上述式子不可求逆，也就无法计算光流。<br>\n",
    "\n",
    "* 通过特征值判断是否计算可信\n",
    "\n",
    "<br>在数学上我们要判断矩阵是否可逆，我们可以通过计算特征值来判断。如果两个特征值远大于0，那么矩阵求逆是可靠的。假如有一个特征值接近于0的话，那么矩阵求逆是不可靠的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面我们举例说明:<br>\n",
    "![avatar](./img/L-K方法1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如上图所示的邻域，沿x轴方向灰度变化平缓，沿y轴方向灰度变化剧烈，这样矩阵求逆是不可靠的。<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![avatar](./img/L-K方法2.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图的位置邻域两个方向灰度变化都很平缓，矩阵求逆也是不可靠的。<br>\n",
    "综合上面的分析，在一帧图像中，真正能有效计算L-K光流的特征很少，一般是两个方向灰度都变化剧烈的角点特征。我们也把这种计算光流的方法称为稀疏光流计算方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面讲的L-K方法是针对于x和y方向位移都很小的情况，因为使用了泰勒展开，泰勒展开一定要在某一点的邻域进行展开。但是有时候相邻帧目标的位移很大，比如飞驰的汽车、飞机。这时候我们需要对L-K方法进行扩展。扩展的基本思路:采用图像金字塔方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![avatar](./img/金字塔L-K方法1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先有两帧原始图像$I_t, I_(t+1)$，先对最顶层图像运行L-K方法，得到一个初始的位移估计值，然后进行对准和上采样，将分辨率提高1倍，此时对得到的较大的图像再运行L-K方法。重复上述步骤直至到达原始的分辨率图像。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "写了一篇光流估计的博客:https://blog.csdn.net/HC_DATA/article/details/86075521"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
